home *** CD-ROM | disk | FTP | other *** search
/ ftp.uv.es / 2014.11.ftp.uv.es.tar / ftp.uv.es / pub / mirror / MailDrop / plug-ins / SamplePlugInProjects.hqx / Sample Plug-in Projects / Old Address Books / Old Address Books.c < prev    next >
C/C++ Source or Header  |  1997-01-08  |  6KB  |  331 lines

  1. #include "Mail Drop PlugIns.h"
  2.  
  3. #ifndef __powerc
  4. #include <SetupA4.h>
  5. #include <A4Stuff.h>
  6. #else
  7. ProcInfoType __procinfo = uppMailDropPlugInProcInfo;
  8. #endif
  9.  
  10. OSErr ConvertFile(MailDropImportParamPtr pb);
  11. void ParseRecipientString(char *theString, char *address, char *realname, short *how);
  12. Boolean ValidAddressChar(char ch);
  13. Boolean ValidRealNameChar(char ch);
  14.  
  15. long clen(char *cptr);
  16. char *ccpy(char *s1, char *s2);
  17. char *ccat(char *s1, char *s2);
  18. short ccmp(char *s1, char *s2);
  19. short cncmp(char *s1, char *s2, short n);
  20. void c2p(char *cptr);
  21. void p2c(StringPtr cptr);
  22.  
  23. pascal OSErr main(short selector, MailDropPlugInPBPtr plugInPBPtr, void *plugInData)
  24. {
  25.     MailDropImportParam    *pb;
  26.  
  27.     OSErr    err;
  28.     short    refNum;
  29.     short    vRefNum;
  30.     long    dirID;
  31.     FSSpec    spec;
  32.     Handle    strHandle;
  33.  
  34. #ifndef __powerc
  35.     long     oldA4;
  36. #endif
  37.  
  38. #ifndef __powerc
  39.     oldA4 = SetCurrentA4();
  40.     RememberA4();
  41. #endif
  42.  
  43.     pb = (MailDropImportParam *)plugInPBPtr;
  44.  
  45.     if (pb == nil) return errNullParamBlock;
  46.     if (pb->type != plugInAddressImport) return errWrongPlugInType;
  47.  
  48.     err = noErr;
  49.  
  50.     switch (selector) {
  51.  
  52.     case selectorImportSetTypeCreator:
  53.         pb->fileType = 'Addr';
  54.         pb->fileCreator  = 'MDrp';
  55.         break;
  56.  
  57.     case selectorImportFile:
  58.         err = ConvertFile(pb);
  59.         break;
  60.  
  61.     case selectorFinish:
  62.         if (pb->addresses != nil) DisposeHandle(pb->addresses);
  63.         break;
  64.     
  65.     default:
  66.         err = errInvalidSelector;
  67.         break;
  68.     }
  69.  
  70. #ifndef __powerc
  71.     SetA4(oldA4);
  72. #endif
  73.  
  74.     return err;
  75. }
  76.  
  77. OSErr ConvertFile(MailDropImportParamPtr pb)
  78. {
  79.     OSErr    err;
  80.     short     refNum;
  81.     long    numChars;
  82.     Handle    data;
  83.  
  84.     Boolean        done = false;
  85.     char        *aline, *nextline, address[256], realname[256];
  86.     short        how;
  87.     char        *tempStr, theWholeThing[512];
  88.  
  89.     pb->addresses = nil;    // just in case
  90.  
  91.     err = FSpOpenDF(&pb->importFile, fsRdPerm, &refNum);
  92.     if (err != noErr) return err;
  93.  
  94.     err = GetEOF(refNum, &numChars);
  95.     if (err != noErr) {
  96.         FSClose(refNum);
  97.         return err;
  98.     }    
  99.  
  100.     data = NewHandleClear(numChars);
  101.     if (data == nil) {
  102.         data = TempNewHandle(numChars, &err);
  103.         if ((data == nil) || (err != noErr)) {
  104.             FSClose(refNum);
  105.             return (err == noErr) ? memFullErr : err;
  106.         }
  107.     }
  108.  
  109.     HLock(data);
  110.     err = FSRead(refNum, &numChars, *data);
  111.     FSClose(refNum);
  112.  
  113.     pb->addresses = NewHandleClear(0);
  114.     if (pb->addresses == nil) {
  115.         DisposeHandle(data);
  116.         return memFullErr;
  117.     }
  118.  
  119.     done = false;
  120.     aline = nextline = *data;
  121.     do {
  122.         while ((*nextline != 0) && (*nextline != 13)) nextline++;
  123.         if (*nextline == 0) done = true;    //  current string is last string
  124.         if ((*nextline == 13) && (*(nextline+1) == 0)) done = true;
  125.         else *nextline++ = 0;
  126.  
  127.         ParseRecipientString(aline, address, realname, &how);
  128.  
  129.         if (address[0] != 0) {
  130.             if (realname[0] == 0) {
  131.                 ccpy(theWholeThing, address);
  132.                 ccat(theWholeThing, "\r");
  133.             }
  134.             else {
  135.                 ccpy(theWholeThing, "\"");
  136.                 ccat(theWholeThing, realname);
  137.                 ccat(theWholeThing, "\" <");
  138.                 ccat(theWholeThing, address);
  139.                 ccat(theWholeThing, ">\r");
  140.             }
  141.             err = PtrAndHand(theWholeThing, pb->addresses, clen(theWholeThing));
  142.             if (err != noErr) {
  143.                 DisposeHandle(pb->addresses);
  144.                 pb->addresses = nil;
  145.                 HUnlock(data);
  146.                 DisposeHandle(data);
  147.                 return err;
  148.             }
  149.         }            
  150.  
  151.         aline = nextline;
  152.     } while (!done);
  153.  
  154.     err = PtrAndHand("", pb->addresses, 1);
  155.     if (err != noErr) {
  156.         DisposeHandle(pb->addresses);
  157.         pb->addresses = nil;
  158.         HUnlock(data);
  159.         DisposeHandle(data);
  160.         return err;
  161.     }
  162.  
  163.     HUnlock(data);
  164.     DisposeHandle(data);
  165.     return noErr;
  166. }
  167.  
  168. void ParseRecipientString(char *theString, char *address, char *realname, short *how)
  169. {
  170.     Boolean doingaddress;
  171.     Boolean doingrealname;
  172.     Boolean doinghow;
  173.  
  174.     short i, j;
  175.  
  176.     address[0] = 0;
  177.     realname[0] = 0;
  178.     *how = 0;
  179.  
  180.     doingaddress = true;
  181.     doingrealname = false;
  182.     doinghow = false;
  183.  
  184.     i = j = 0;
  185.     while (i < clen(theString)) {
  186.         switch (theString[i]) {
  187.         case 0:        // null
  188.         case 13:    // cr
  189.             return;
  190.             break;
  191.         case 9: // tab
  192.             i++;
  193.             if (doingaddress) {
  194.                 doingaddress = false;
  195.                 doingrealname = true;
  196.             }
  197.             else if (doingrealname) {
  198.                 doingrealname = false;
  199.                 doinghow = true;
  200.             }
  201.             j = 0;
  202.             break;
  203.         default:
  204.             if (doingaddress) {
  205.                 if (ValidAddressChar(theString[i])) {
  206.                     address[j++] = theString[i];
  207.                     address[j] = 0;
  208.                 }
  209.             }            
  210.             else if (doingrealname) {
  211.                 if (ValidRealNameChar(theString[i])) {
  212.                     if (theString[i] == '\"') realname[j++] = '\'';
  213.                     else realname[j++] = theString[i];
  214.                     realname[j] = 0;
  215.                 }
  216.             }
  217.             else {
  218.                 switch (theString[i]) {
  219.                 case 'T':
  220.                 case 't':
  221.                     *how = 0;
  222.                     break;
  223.                 case 'C':
  224.                 case 'c':
  225.                     *how = 0;
  226.                     break;
  227.                 case 'B':
  228.                 case 'b':
  229.                     *how = 0;
  230.                     break;
  231.                 default:
  232.                     *how = 0;
  233.                     break;
  234.                 }
  235.             }
  236.             i++;
  237.             break;
  238.         }
  239.     }
  240. }
  241.  
  242. Boolean ValidAddressChar(char ch)
  243. {
  244.     if (ch < 32) return false;
  245.     if (ch == '<') return false;
  246.     if (ch == '>') return false;
  247.     if (ch == '\"') return false;
  248.     if (ch == '\\') return false;
  249.     if (ch == '\'') return false;
  250.     if (ch == ',') return false;
  251.     if (ch >= 127) return false;
  252.     return true;
  253. }
  254.  
  255. Boolean ValidRealNameChar(char ch)
  256. {
  257.     if (ch < 32) return false;
  258.     if (ch == '<') return false;
  259.     if (ch == '>') return false;
  260.     if (ch == '\\') return false;
  261.     if (ch == '(') return false;
  262.     if (ch == ')') return false;
  263.     if (ch == '@') return false;
  264.     if (ch >= 127) return false;
  265.     return true;
  266. }
  267.  
  268. // String Stuff (so you don't need ANSI libs)
  269.  
  270. long clen(char *cptr)
  271. {
  272.     long    i;
  273.  
  274.     for (i = 0; cptr[i]; ++i);
  275.     return(i);
  276. }
  277.  
  278. char *ccpy(char *s1, char *s2)
  279. {
  280.     char    *c1, *c2;
  281.  
  282.     c1 = s1;
  283.     c2 = s2;
  284.     while (*c1++ = *c2++);
  285.     return(s1);
  286. }
  287.  
  288. char *ccat(char *s1, char *s2)
  289. {
  290.     ccpy(s1 + clen(s1), s2);
  291.     return(s1);
  292. }
  293.  
  294. short ccmp(char *s1, char *s2)
  295. {
  296.     char    *c1, *c2;
  297.  
  298.     c1 = s1;
  299.     c2 = s2;
  300.     for (; *c1 == *c2; c1++, c2++)
  301.         if (*c1 == '\0') return 0;
  302.     return *c1 - *c2;
  303. }
  304.  
  305. short cncmp(char *s1, char *s2, short n)
  306. {
  307.     char    *c1, *c2;
  308.  
  309.     c1 = s1;
  310.     c2 = s2;
  311.     if (n == 0) return 0;
  312.     for (; ((*c1 == *c2) && (n != 1)); c1++, c2++, n--)
  313.         if (*c1 == '\0') return 0;
  314.     return *c1 - *c2;
  315. }
  316.  
  317. void c2p(char *cptr)
  318. {
  319.     char    len;
  320.  
  321.     BlockMove(cptr, cptr + 1, len = clen(cptr));
  322.     *cptr = len;
  323. }
  324.  
  325. void p2c(StringPtr cptr)
  326. {
  327.     char    len;
  328.  
  329.     BlockMove(cptr + 1, cptr, len = *cptr);
  330.     cptr[len] = 0;
  331. }